﻿2026-05-10T12:18:40.3424881Z ##[group]Run pnpm verify:phase-5
2026-05-10T12:18:40.3425212Z [36;1mpnpm verify:phase-5[0m
2026-05-10T12:18:40.3448402Z shell: /usr/bin/bash -e {0}
2026-05-10T12:18:40.3448653Z env:
2026-05-10T12:18:40.3448903Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T12:18:40.3449231Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T12:18:40.3449460Z   SKIP_TRACE_CHECK: 1
2026-05-10T12:18:40.3449692Z ##[endgroup]
2026-05-10T12:18:40.6432401Z 
2026-05-10T12:18:40.6433121Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T12:18:40.6433835Z > node scripts/verify-phase-5.mjs
2026-05-10T12:18:40.6434130Z 
2026-05-10T12:18:40.6763712Z 
2026-05-10T12:18:40.6764529Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T12:18:40.6765579Z >>> pnpm verify:phase-4
2026-05-10T12:18:40.9638613Z 
2026-05-10T12:18:40.9639778Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T12:18:40.9640675Z > node scripts/verify-phase-4.mjs
2026-05-10T12:18:40.9641472Z 
2026-05-10T12:18:40.9928204Z 
2026-05-10T12:18:40.9929023Z === Workspace: typecheck ===
2026-05-10T12:18:40.9929757Z >>> pnpm -r typecheck
2026-05-10T12:18:41.2898905Z Scope: 5 of 6 workspace projects
2026-05-10T12:18:41.2950701Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:18:41.2959744Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:18:43.7929196Z packages/game-logic typecheck: Done
2026-05-10T12:18:43.7948581Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:18:46.0419054Z packages/db typecheck: Done
2026-05-10T12:18:47.2694289Z packages/protocol typecheck: Done
2026-05-10T12:18:47.2701911Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:18:47.2704661Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:18:58.2680807Z apps/client typecheck: Done
2026-05-10T12:18:59.1573922Z apps/server typecheck: Done
2026-05-10T12:18:59.1690165Z 
2026-05-10T12:18:59.1691025Z === Lint: protocol-sync ===
2026-05-10T12:18:59.1691716Z >>> pnpm lint:protocol-sync
2026-05-10T12:18:59.4682893Z 
2026-05-10T12:18:59.4683625Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T12:18:59.4684181Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T12:18:59.4684411Z 
2026-05-10T12:18:59.5010402Z lint-protocol-sync: OK
2026-05-10T12:18:59.5144065Z 
2026-05-10T12:18:59.5145152Z === Lint: game-logic-purity ===
2026-05-10T12:18:59.5145961Z >>> pnpm lint:game-logic-purity
2026-05-10T12:18:59.8118595Z 
2026-05-10T12:18:59.8119817Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T12:18:59.8120844Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T12:18:59.8121467Z 
2026-05-10T12:18:59.8445254Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T12:18:59.8579436Z 
2026-05-10T12:18:59.8580338Z === Lint: better-auth-schema-sync ===
2026-05-10T12:18:59.8581261Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T12:19:00.1605503Z 
2026-05-10T12:19:00.1606768Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:19:00.1608387Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T12:19:00.1609127Z 
2026-05-10T12:19:01.6708647Z lint-better-auth-schema-sync: OK
2026-05-10T12:19:01.6848437Z 
2026-05-10T12:19:01.6849550Z === Lint: rate-limit-budgets ===
2026-05-10T12:19:01.6850390Z >>> pnpm lint:rate-limit-budgets
2026-05-10T12:19:01.9798767Z 
2026-05-10T12:19:01.9810035Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T12:19:01.9816073Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T12:19:01.9830972Z 
2026-05-10T12:19:02.0125032Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T12:19:02.0260059Z 
2026-05-10T12:19:02.0260960Z === Lint: no-clipboard-rce ===
2026-05-10T12:19:02.0261786Z >>> pnpm lint:no-clipboard-rce
2026-05-10T12:19:02.3220831Z 
2026-05-10T12:19:02.3221519Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T12:19:02.3222053Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T12:19:02.3222284Z 
2026-05-10T12:19:02.3583232Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T12:19:02.3725157Z 
2026-05-10T12:19:02.3725973Z === Lint: room-layout ===
2026-05-10T12:19:02.3726600Z >>> pnpm lint:room-layout
2026-05-10T12:19:02.6661881Z 
2026-05-10T12:19:02.6663090Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T12:19:02.6663981Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T12:19:02.6664416Z 
2026-05-10T12:19:02.7022732Z lint-room-layout: OK
2026-05-10T12:19:02.7165689Z 
2026-05-10T12:19:02.7166506Z === ADR 0004 lint ===
2026-05-10T12:19:02.7167090Z >>> pnpm lint:adr:0004
2026-05-10T12:19:03.0144097Z 
2026-05-10T12:19:03.0144767Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T12:19:03.0145441Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T12:19:03.0145820Z 
2026-05-10T12:19:03.0457603Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:19:03.0589833Z 
2026-05-10T12:19:03.0590718Z === Drizzle: emit-check ===
2026-05-10T12:19:03.0591501Z >>> pnpm db:emit-check
2026-05-10T12:19:03.3519285Z 
2026-05-10T12:19:03.3520412Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T12:19:03.3523089Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T12:19:03.3525056Z 
2026-05-10T12:19:03.7893996Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T12:19:03.7895843Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T12:19:04.1678279Z 8 tables
2026-05-10T12:19:04.1679023Z accounts 8 columns 1 indexes 0 fks
2026-05-10T12:19:04.1679810Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T12:19:04.1680694Z characters 9 columns 0 indexes 1 fks
2026-05-10T12:19:04.1681505Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T12:19:04.1682377Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T12:19:04.1683204Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T12:19:04.1683990Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T12:19:04.1684760Z sessions 5 columns 0 indexes 1 fks
2026-05-10T12:19:04.1685254Z 
2026-05-10T12:19:04.1686082Z No schema changes, nothing to migrate 😴
2026-05-10T12:19:04.2801451Z 
2026-05-10T12:19:04.2802374Z === Drizzle: schema-sync ===
2026-05-10T12:19:04.2803088Z >>> pnpm lint:schema-sync
2026-05-10T12:19:04.5682438Z 
2026-05-10T12:19:04.5683520Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:19:04.5686870Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:19:04.5689509Z 
2026-05-10T12:19:04.5972615Z OK
2026-05-10T12:19:04.6102104Z 
2026-05-10T12:19:04.6102678Z === Drizzle: source-comments ===
2026-05-10T12:19:04.6103330Z >>> pnpm lint:source-comments
2026-05-10T12:19:04.9029870Z 
2026-05-10T12:19:04.9031065Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:19:04.9032388Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:19:04.9033596Z 
2026-05-10T12:19:05.2188523Z 
2026-05-10T12:19:05.2189814Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:19:05.2190876Z > node scripts/check-source-comments.mjs
2026-05-10T12:19:05.2191486Z 
2026-05-10T12:19:05.2503157Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:19:05.2743470Z 
2026-05-10T12:19:05.2744334Z === Workspace: test ===
2026-05-10T12:19:05.2745213Z >>> pnpm -r test
2026-05-10T12:19:05.5738136Z Scope: 5 of 6 workspace projects
2026-05-10T12:19:05.5950623Z packages/db test$ vitest run
2026-05-10T12:19:05.5952660Z packages/game-logic test$ vitest run
2026-05-10T12:19:06.0880104Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:19:06.0969421Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:19:06.4020001Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T12:19:06.6900159Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:06.9400252Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:19:07.0259902Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T12:19:07.1829765Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:19:07.1909536Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:19:07.1950234Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:19:07.1980404Z packages/game-logic test: [2m   Start at [22m 12:19:06
2026-05-10T12:19:07.2000255Z packages/game-logic test: [2m   Duration [22m 1.10s[2m (transform 130ms, setup 0ms, import 216ms, tests 67ms, environment 1ms)[22m
2026-05-10T12:19:07.2508182Z packages/game-logic test: Done
2026-05-10T12:19:07.2528809Z packages/protocol test$ vitest run
2026-05-10T12:19:07.7654997Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:19:07.8529534Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T12:19:08.0978571Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:08.1216987Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:19:08.1248070Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:19:08.1262333Z packages/db test: [2m   Start at [22m 12:19:06
2026-05-10T12:19:08.1299306Z packages/db test: [2m   Duration [22m 2.01s[2m (transform 175ms, setup 0ms, import 1.38s, tests 32ms, environment 0ms)[22m
2026-05-10T12:19:08.1752827Z packages/db test: Done
2026-05-10T12:19:08.2170128Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:19:08.3764133Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:19:08.5489314Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:19:08.7028718Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:19:08.7079026Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:19:08.7091309Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:19:08.7092501Z packages/protocol test: [2m   Start at [22m 12:19:07
2026-05-10T12:19:08.7094012Z packages/protocol test: [2m   Duration [22m 931ms[2m (transform 168ms, setup 0ms, import 309ms, tests 30ms, environment 0ms)[22m
2026-05-10T12:19:08.7407310Z packages/protocol test: Done
2026-05-10T12:19:08.7412611Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:19:08.7415391Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:19:09.2892292Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:19:09.3220081Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:19:10.3301954Z apps/server test: {"level":30,"time":1778415550325,"pid":4340,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:19:10.3339003Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 722[2mms[22m[39m
2026-05-10T12:19:10.3364675Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 555[2mms[22m[39m
2026-05-10T12:19:10.8850484Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:19:10.8869261Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:19:10.9119977Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 143[2mms[22m[39m
2026-05-10T12:19:11.5010740Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 45[2mms[22m[39m
2026-05-10T12:19:12.0826848Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 140[2mms[22m[39m
2026-05-10T12:19:12.3780639Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:19:12.3804369Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-QitKkH/rebno.db
2026-05-10T12:19:12.3811718Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:12.3821422Z apps/server test: [run-migrations] OK
2026-05-10T12:19:12.3939375Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:19:12.3959094Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-xSlcc9/rebno.db
2026-05-10T12:19:12.3968952Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:12.3999144Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:19:12.4000464Z apps/server test: [run-migrations] OK
2026-05-10T12:19:12.4059758Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:19:12.4073996Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-v9ERVN/rebno.db
2026-05-10T12:19:12.4112776Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:12.4128317Z apps/server test: [run-migrations] OK
2026-05-10T12:19:12.4134428Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:19:12.4137434Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-v9ERVN/rebno.db
2026-05-10T12:19:12.4139588Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:12.4140753Z apps/server test: [run-migrations] OK
2026-05-10T12:19:12.4206990Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-10T12:19:12.7155002Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T12:19:13.0011228Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:19:13.2049656Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 111[2mms[22m[39m
2026-05-10T12:19:13.2845189Z apps/server test: {"level":40,"time":1778415553278,"pid":4439,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:13.2940065Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T12:19:13.3039440Z apps/server test: {"level":40,"time":1778415553285,"pid":4439,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:13.3079144Z apps/server test: {"level":40,"time":1778415553286,"pid":4439,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:13.6438339Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T12:19:13.8652422Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:14.1102904Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:14.3236579Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:19:14.4214465Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 116[2mms[22m[39m
2026-05-10T12:19:15.1666882Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:19:15.1669167Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ enable debugging { debug: true }
2026-05-10T12:19:15.1673216Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:19:15.5690291Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-10T12:19:15.9248438Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:15.9379700Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:19:15.9403986Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:19:15.9447465Z apps/server test: [2m   Start at [22m 12:19:09
2026-05-10T12:19:15.9469311Z apps/server test: [2m   Duration [22m 6.60s[2m (transform 478ms, setup 0ms, import 3.38s, tests 949ms, environment 2ms)[22m
2026-05-10T12:19:16.0072436Z apps/server test: Done
2026-05-10T12:19:16.4523177Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:19:17.1978859Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:18.0087329Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:18.7162591Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:19.4294741Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:19:20.1457479Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:19:20.8968354Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:19:21.6063392Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:19:22.2983531Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:19:23.0014760Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:19:23.7070722Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:19:23.7266980Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:19:23.7292237Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:19:23.7303216Z apps/client test: [2m   Start at [22m 12:19:09
2026-05-10T12:19:23.7309310Z apps/client test: [2m   Duration [22m 14.44s[2m (transform 536ms, setup 45ms, collect 859ms, tests 627ms, environment 8.39s, prepare 1.61s)[22m
2026-05-10T12:19:23.8730209Z apps/client test: Done
2026-05-10T12:19:23.8827096Z 
2026-05-10T12:19:23.8828630Z verify-phase-4: OK (12 steps green)
2026-05-10T12:19:23.8978770Z 
2026-05-10T12:19:23.8979874Z === Workspace: typecheck ===
2026-05-10T12:19:23.8980702Z >>> pnpm -r typecheck
2026-05-10T12:19:24.2106368Z Scope: 5 of 6 workspace projects
2026-05-10T12:19:24.2163347Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:19:24.2171268Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:19:26.9380012Z packages/game-logic typecheck: Done
2026-05-10T12:19:26.9408683Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:19:29.2404818Z packages/db typecheck: Done
2026-05-10T12:19:30.6172634Z packages/protocol typecheck: Done
2026-05-10T12:19:30.6180892Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:19:30.6199227Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:19:41.6426380Z apps/client typecheck: Done
2026-05-10T12:19:42.6184499Z apps/server typecheck: Done
2026-05-10T12:19:42.6301462Z 
2026-05-10T12:19:42.6302425Z === Lint: deploy-stack ===
2026-05-10T12:19:42.6303377Z >>> pnpm lint:deploy-stack
2026-05-10T12:19:42.9361346Z 
2026-05-10T12:19:42.9362414Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T12:19:42.9363434Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T12:19:42.9363976Z 
2026-05-10T12:19:42.9707103Z lint-deploy-stack: OK
2026-05-10T12:19:42.9854755Z 
2026-05-10T12:19:42.9855643Z === Lint: deploy-stack test ===
2026-05-10T12:19:42.9856408Z >>> pnpm lint:deploy-stack:test
2026-05-10T12:19:43.2908918Z 
2026-05-10T12:19:43.2910087Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-10T12:19:43.2911205Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-10T12:19:43.2911817Z 
2026-05-10T12:19:43.3613128Z PASS: lint-deploy-stack green
2026-05-10T12:19:43.3778825Z 
2026-05-10T12:19:43.3779737Z === ADR 0005 lint ===
2026-05-10T12:19:43.3780420Z >>> pnpm lint:adr:0005
2026-05-10T12:19:43.6795742Z 
2026-05-10T12:19:43.6796841Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-10T12:19:43.6798487Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-10T12:19:43.6799422Z 
2026-05-10T12:19:43.7123258Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:19:43.7263421Z 
2026-05-10T12:19:43.7264310Z === ADR 0006 lint ===
2026-05-10T12:19:43.7265016Z >>> pnpm lint:adr:0006
2026-05-10T12:19:44.0261091Z 
2026-05-10T12:19:44.0262177Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-10T12:19:44.0263593Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-10T12:19:44.0264516Z 
2026-05-10T12:19:44.0577156Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:19:44.0722068Z 
2026-05-10T12:19:44.0723007Z === Workspace: test ===
2026-05-10T12:19:44.0724498Z >>> pnpm -r test
2026-05-10T12:19:44.3758586Z Scope: 5 of 6 workspace projects
2026-05-10T12:19:44.3813167Z packages/db test$ vitest run
2026-05-10T12:19:44.3822558Z packages/game-logic test$ vitest run
2026-05-10T12:19:44.8888819Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:19:44.8904095Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:19:45.2170258Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:19:45.5033910Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:45.7415710Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:19:45.8891368Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:19:45.9769885Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:19:45.9842820Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:19:45.9899326Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:19:45.9900414Z packages/game-logic test: [2m   Start at [22m 12:19:44
2026-05-10T12:19:45.9919214Z packages/game-logic test: [2m   Duration [22m 1.09s[2m (transform 132ms, setup 0ms, import 231ms, tests 46ms, environment 1ms)[22m
2026-05-10T12:19:46.0312200Z packages/game-logic test: Done
2026-05-10T12:19:46.0338853Z packages/protocol test$ vitest run
2026-05-10T12:19:46.5311906Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:19:46.6610077Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T12:19:46.9248461Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:46.9330650Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:19:46.9369051Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:19:46.9388379Z packages/db test: [2m   Start at [22m 12:19:44
2026-05-10T12:19:46.9407087Z packages/db test: [2m   Duration [22m 2.03s[2m (transform 191ms, setup 0ms, import 1.39s, tests 28ms, environment 0ms)[22m
2026-05-10T12:19:46.9579859Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T12:19:46.9791412Z packages/db test: Done
2026-05-10T12:19:47.1288195Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:47.3008390Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:19:47.4892063Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:19:47.4919111Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:19:47.4940421Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:19:47.4948815Z packages/protocol test: [2m   Start at [22m 12:19:46
2026-05-10T12:19:47.4955008Z packages/protocol test: [2m   Duration [22m 952ms[2m (transform 134ms, setup 0ms, import 269ms, tests 37ms, environment 0ms)[22m
2026-05-10T12:19:47.5245425Z packages/protocol test: Done
2026-05-10T12:19:47.5250296Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:19:47.5253085Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:19:48.0755546Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:19:48.1205381Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:19:49.1009948Z apps/server test: {"level":30,"time":1778415589093,"pid":5194,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:19:49.1034909Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 686[2mms[22m[39m
2026-05-10T12:19:49.1059130Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 569[2mms[22m[39m
2026-05-10T12:19:49.7480691Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:19:49.7498586Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:19:49.7670524Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 124[2mms[22m[39m
2026-05-10T12:19:50.1546500Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:19:50.1559238Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Akf5VD/rebno.db
2026-05-10T12:19:50.1569097Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:50.1582557Z apps/server test: [run-migrations] OK
2026-05-10T12:19:50.1710311Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:19:50.1721326Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-XhWohN/rebno.db
2026-05-10T12:19:50.1723963Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:50.1741935Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:19:50.1744409Z apps/server test: [run-migrations] OK
2026-05-10T12:19:50.1809762Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:19:50.1839330Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-sbD8Hz/rebno.db
2026-05-10T12:19:50.1859292Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:50.1860675Z apps/server test: [run-migrations] OK
2026-05-10T12:19:50.1862690Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:19:50.1864657Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-sbD8Hz/rebno.db
2026-05-10T12:19:50.1866516Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:19:50.1867639Z apps/server test: [run-migrations] OK
2026-05-10T12:19:50.1915009Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 50[2mms[22m[39m
2026-05-10T12:19:50.9820438Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-10T12:19:51.1862317Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 60[2mms[22m[39m
2026-05-10T12:19:51.5032097Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-10T12:19:51.8055487Z apps/server test: {"level":40,"time":1778415591801,"pid":5292,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:51.8141999Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T12:19:51.8281308Z apps/server test: {"level":40,"time":1778415591805,"pid":5292,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:51.8299452Z apps/server test: {"level":40,"time":1778415591805,"pid":5292,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:19:52.1037379Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T12:19:52.1361661Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 106[2mms[22m[39m
2026-05-10T12:19:52.3892906Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T12:19:52.6602019Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:19:52.9099024Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:19:53.3215949Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 150[2mms[22m[39m
2026-05-10T12:19:53.6999491Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:19:53.7001372Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ enable debugging { debug: true }
2026-05-10T12:19:53.7019527Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:19:54.4210881Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-10T12:19:54.4634184Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:54.7513131Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:54.7636441Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:19:54.7675992Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:19:54.7707108Z apps/server test: [2m   Start at [22m 12:19:48
2026-05-10T12:19:54.7719053Z apps/server test: [2m   Duration [22m 6.67s[2m (transform 461ms, setup 0ms, import 3.36s, tests 924ms, environment 2ms)[22m
2026-05-10T12:19:54.8143483Z apps/server test: Done
2026-05-10T12:19:55.2366712Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:19:56.0834858Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:19:56.7760494Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:19:57.4845964Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:19:58.1897282Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:19:58.8785007Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:19:59.6042859Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:20:00.3100435Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:20:01.0080319Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:20:01.7136418Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:20:02.4072055Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:20:02.4309685Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:20:02.4315300Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:20:02.4331006Z apps/client test: [2m   Start at [22m 12:19:48
2026-05-10T12:20:02.4351173Z apps/client test: [2m   Duration [22m 14.31s[2m (transform 530ms, setup 52ms, collect 827ms, tests 630ms, environment 8.26s, prepare 1.60s)[22m
2026-05-10T12:20:02.5758025Z apps/client test: Done
2026-05-10T12:20:02.5900533Z 
2026-05-10T12:20:02.5901312Z verify-phase-5: OK (7 steps green)
